import uuid
import oss2

# 用户账号密码，第三部说明的Access
# 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建RAM账号。
# 获取的AccessKey
from aliyunsdkcore.http.http_response import HttpResponse
from django.views.decorators.csrf import csrf_exempt

auth = oss2.Auth('LTAI5tDV4hsb5GKqA5s2fcNV', 'ux8B8yC9mTDEE9HP1OXXAcRFoiaK6k')
# 这个是需要用特定的地址，不同地域的服务器地址不同，不要弄错了
# 参考官网给的地址配置https://www.alibabacloud.com/help/zh/object-storage-service/latest/regions-and-endpoints#concept-zt4-cvy-5db
endpoint = 'http://oss-cn-beijing.aliyuncs.com'
# 你的项目名称，类似于不同的项目上传的图片前缀url不同
bucket = oss2.Bucket(auth, endpoint, 'fengrucup')  # 项目名称
bucket2 = oss2.Bucket(auth, endpoint, 'fengru-pic')
# 这个是上传图片后阿里云返回的uri需要拼接下面这个url才可以访问，根据自己情况去写这步
base_file_url = 'https://fengrucup.oss-cn-beijing.aliyuncs.com/'
base_file_url2 = 'https://fengru-pic.oss-cn-beijing.aliyuncs.com/'
# 进度条
# 当无法确定待上传的数据长度时，total_bytes的值为None。
def percentage(consumed_bytes, total_bytes):
    if total_bytes:
        rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
        print('\r{0}% '.format(rate), end='')


def update_fil_file(file):
    """
    ！ 上传单张图片
    :param file: b字节文件
    :return: 若成功返回图片路径，若不成功返回空
    """
    # 生成文件编号，如果文件名重复的话在oss中会覆盖之前的文件
    number = uuid.uuid4()
    # 生成文件名
    base_fil_name = str(number) + '.mp3'
    # 生成外网访问的文件路径
    file_name = base_file_url + base_fil_name
    # 这个是阿里提供的SDK方法 bucket是调用的4.1中配置的m变量名
    res = bucket.put_object(base_fil_name, file, progress_callback=percentage)
    # 如果上传状态是200 代表成功 返回文件外网访问路径
    # 下面代码根据自己的需求写
    if res.status == 200:
        return file_name
    else:
        return False


def update_fil_image(file):
    """
    ！ 上传单张图片
    :param file: b字节文件
    :return: 若成功返回图片路径，若不成功返回空
    """
    # 生成文件编号，如果文件名重复的话在oss中会覆盖之前的文件
    number = uuid.uuid4()
    # 生成文件名
    base_fil_name = str(number) + '.png'
    # 生成外网访问的文件路径
    file_name = base_file_url2 + base_fil_name
    # 这个是阿里提供的SDK方法 bucket是调用的4.1中配置的m变量名
    res = bucket2.put_object(base_fil_name, file, progress_callback=percentage)
    # 如果上传状态是200 代表成功 返回文件外网访问路径
    # 下面代码根据自己的需求写
    if res.status == 200:
        return file_name
    else:
        return False
